/*
 * CustomerAction.java
 * 
 * Created on 02/10/2007, 12:43:14 PM
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view.actions;

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.bean.Eleccion;
import model.bean.NivelAcceso;
import model.bean.Socio;
import model.bean.Tipo;
import model.bean.Usuario;
import model.factory.RecreacionalFactory;
import model.service.EleccionService;
import model.service.SocioService;
import model.service.UsuarioService;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.dao.DataAccessException;
import view.common.Constants;
import view.common.Menu;
import view.common.MenuOpcion;
import view.common.struts.CustomActionForm;

import view.common.struts.CustomDispatchAction;

/**
 * @Archivo LoginAction.java
 * @Fecha                @Autor   @Cambios
 * 21/01/2011 02:35:29 PM       moshiro
 */
public class LoginAction extends CustomDispatchAction {

    private final static String HOME = "home";
    private final static String LOGIN = "login";

    @Override
    public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) throws Exception {
        CustomActionForm loginForm = (CustomActionForm) form;
        loginForm.setBean(new Usuario());
        return mapping.findForward(LOGIN);
    }

    public ActionForward login(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) throws Exception {
        CustomActionForm loginForm = (CustomActionForm) form;
        Usuario vo;
        vo = (Usuario) loginForm.getBean();
        vo.setLogin(vo.getLogin().trim());
        vo.setPassword(vo.getPassword().trim());

        if (vo.getLogin() == null || vo.getLogin().length() == 0) {
            loginForm.setBean(new Usuario());
            sendErrorMessage(req, "login.error.invalidUser.empty");
            return mapping.findForward(LOGIN);
        } else if (vo.getPassword() == null || vo.getPassword().length() == 0) {
            sendErrorMessage(req, "login.error.invalidPassword.empty");
            return mapping.findForward(LOGIN);
        }
        String password = vo.getPassword();
        vo.setPassword(null);

        try {
            Usuario usuario = getUsuarioService().getUsuario(vo);
            if (usuario == null) {
                //ERROR: Usuario no existe
                loginForm.setBean(new Usuario());
                sendErrorMessage(req, "login.error.invalidUser");
                return mapping.findForward(LOGIN);
            } else {
                if (!usuario.getPassword().trim().equals(password)) {
                    //ERROR: PASSWORD INVALIDO
                    ((Usuario) loginForm.getBean()).setPassword(null);
                    sendErrorMessage(req, "login.error.invalidPassword");
                    return mapping.findForward(LOGIN);
                } else if (usuario.getEstado() == null || usuario.getEstado().equals(Constants.ESTADO_INACTIVO)) {
                    //ERROR: USER INACTIVE
                    sendErrorMessage(req, "login.error.inactiveUser");
                    return mapping.findForward(LOGIN);
                } else if (usuario.getTipo() == null) {
                    //ERROR: TYPE EMPTY
                    sendErrorMessage(req, "login.error.invalidType");
                    return mapping.findForward(LOGIN);
                } else {
                    Tipo tipo = getUsuarioService().getNivelAcceso(usuario.getTipo().getId());
                    if (tipo == null || tipo.getId() == null) {
                        sendErrorMessage(req, "login.error.invalidOption");
                        return mapping.findForward(LOGIN);
                    } else {
                        //LOGON A SISTEMA RECREACIONAL
                        List<NivelAcceso> optionlist = tipo.getAccesos();
                        Menu menu = new Menu();
                        menu.fillMenuList(optionlist);
                        List<MenuOpcion> menuList = menu.getMenuList();

                        if (menuList == null || menuList.isEmpty()) {
                            sendErrorMessage(req, "login.error.invalidOption");
                            return mapping.findForward(LOGIN);
                        } else {
                            //Paint Menu
                            usuario.setTipo(tipo);
                            usuario.setOpciones(menuList);
                            //Obtener Socio
                            Socio socio = new Socio((usuario.getSocio() == null || usuario.getSocio().getCodigo() == null) ? -1L : usuario.getSocio().getCodigo());
                            socio = getSocioService().obtenerSocio(socio);
                            usuario.setSocio(socio);
                            loginForm.setBean(new Usuario());
                            req.getSession().setAttribute(Constants.SESSION_USER, usuario);

                            //Obteniendo Eleccion Activa
                            Eleccion eleccion = new Eleccion();
                            eleccion.setEstado(Constants.ESTADO_ACTIVO);
                            eleccion = getEleccionService().obtenerEleccion(eleccion);
                            if (eleccion != null) {
                                logger.info("Eleccion Activa: " + eleccion.getNombre());
                                req.getSession().setAttribute(Constants.SESSION_ELECCION, eleccion);
                            }
                            //return new ActionRedirect(((NivelAcceso) menuList.get(0).getChild()).getOpcion().getAccion());
                            return mapping.findForward(HOME);
                        }
                    }
                }
            }
        } catch (DataAccessException ex) {
            logger.warn("Exception updating", ex);
            throw new Exception(ex);
        }
    }

    public ActionForward home(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) throws Exception {
        return mapping.findForward(HOME);
    }

    public UsuarioService getUsuarioService() {
        return RecreacionalFactory.getInstance().getUsuarioService();
    }

    public SocioService getSocioService() {
        return RecreacionalFactory.getInstance().getSocioService();
    }

    public EleccionService getEleccionService() {
        return RecreacionalFactory.getInstance().getEleccionService();
    }
}
